package com.carboy.launch.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.carboy.launch.bean.ConfigInfo;
import com.carboy.launch.bean.Version;

public class ParseXmlService {

	public static HashMap<String, String> parseXml(InputStream inStream)
			throws Exception {
		HashMap<String, String> hashMap = new HashMap<String, String>();

		// 实例化一个文档构建器工厂
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 通过文档构建器工厂获取一个文档构建器
		DocumentBuilder builder = factory.newDocumentBuilder();
		// 通过文档通过文档构建器构建一个文档实例
		Document document = builder.parse(inStream);
		// 获取XML文件根节点
		Element root = document.getDocumentElement();
		// 这一层节点只有一个子节点， 就是（version）节点。
		NodeList versionNode = root.getChildNodes();

		// versionN.getN
		// Element versionRoot = (Element)versionN;

		for (int i = 0; i < versionNode.getLength(); i++) {

			Node versionN = (Node) versionNode.item(i);
			if (versionN.getNodeType() == Node.ELEMENT_NODE) {
				Element versionRoot = (Element) versionN;
				if ("version".equals(versionRoot.getNodeName())) {

					// 获得所有子节点，遍历version节点中的子节点
					NodeList childNodes = versionRoot.getChildNodes();
					for (int j = 0; j < childNodes.getLength(); j++) {
						// 遍历子节点
						Node childNode = (Node) childNodes.item(j);
						if (childNode.getNodeType() == Node.ELEMENT_NODE) {
							Element childElement = (Element) childNode;
							// 版本号
							if ("versionName"
									.equals(childElement.getNodeName())) {

								hashMap.put("versionName", childElement
										.getFirstChild().getNodeValue());
							}
							// 软件名称
							else if (("appName".equals(childElement
									.getNodeName()))) {
								hashMap.put("appName", childElement
										.getFirstChild().getNodeValue());
							}
							// 下载地址
							else if (("url".equals(childElement.getNodeName()))) {
								hashMap.put("url", childElement.getFirstChild()
										.getNodeValue());
							} else if (("versionTime").equals(childElement
									.getNodeName())) {
								hashMap.put("versionTime", childElement
										.getFirstChild().getNodeValue());

							}
						}
					}
				}

			}
		}
		return hashMap;
	}

	/**
	 * 
	 * @author James
	 * @Description 解析XML版本信息
	 * @param inStream
	 * @return
	 */
	public static Version getVersionInfo(InputStream inStream) {

		Version mVersion = null;
		ArrayList<ConfigInfo> mList = null;

		if (inStream != null) {
			mVersion = new Version();
			mList = new ArrayList<ConfigInfo>();

			try {
				// 实例化一个文档构建器工厂
				DocumentBuilderFactory factory = DocumentBuilderFactory
						.newInstance();
				// 通过文档构建器工厂获取一个文档构建器
				DocumentBuilder builder = factory.newDocumentBuilder();
				// 通过文档通过文档构建器构建一个文档实例
				Document document = builder.parse(inStream);
				// 获取XML文件根节点
				Element root = document.getDocumentElement();
				// 获取根节点的子节点集合
				NodeList versionNode = root.getChildNodes();
				for (int i = 0; i < versionNode.getLength(); i++) {
					// 遍历根节点
					Node versionN = (Node) versionNode.item(i);
					if (versionN.getNodeType() == Node.ELEMENT_NODE) {
						Element versionRoot = (Element) versionN;
						if ("type".equals(versionRoot.getNodeName())) {
							// 获得type所有子节点
							NodeList childNodes = versionRoot.getChildNodes();
							parserXml(mList, childNodes);
						}
					}
				}
				mVersion.setVersion(mList);

			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			} catch (SAXException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return mVersion;
	}

	/**
	 * 
	 * @author James
	 * @Description 解析封装数据
	 * @param mList
	 * @param childNodes
	 */
	public static void parserXml(ArrayList<ConfigInfo> mList,
			NodeList childNodes) {

		ConfigInfo mConfigInfo = new ConfigInfo();
		for (int j = 0; j < childNodes.getLength(); j++) {
			Node versionN = (Node) childNodes.item(j);
			if (versionN.getNodeType() == Node.ELEMENT_NODE) {
				Element childRoot = (Element) versionN;
				if ("name".equals(childRoot.getNodeName())) {
					mConfigInfo.setAppName(childRoot.getFirstChild()
							.getNodeValue());
					JwdLog.i("xml", childRoot.getFirstChild().getNodeValue());
				} else if ("date".equals(childRoot.getNodeName())) {
					mConfigInfo.setVersion(childRoot.getFirstChild()
							.getNodeValue());
					JwdLog.i("xml", childRoot.getFirstChild().getNodeValue());
				} else if ("version".equals(childRoot.getNodeName())) {
					mConfigInfo.setVersion(childRoot.getFirstChild()
							.getNodeValue());
					JwdLog.i("xml", childRoot.getFirstChild().getNodeValue());
				} else if ("pgname".equals(childRoot.getNodeName())) {
					mConfigInfo.setVersion(childRoot.getFirstChild()
							.getNodeValue());
					JwdLog.i("xml", childRoot.getFirstChild().getNodeValue());
				} else if ("file".equals(childRoot.getNodeName())) {
					mConfigInfo
							.setUrl(childRoot.getFirstChild().getNodeValue());
					JwdLog.i("xml", childRoot.getFirstChild().getNodeValue());
				}
			}
		}
		mList.add(mConfigInfo);
	}

}
